package main.leetcode.clockin.March;

/**
 * 892.三维形体的表面积
 *
 * <p>在 N * N 的网格上，我们放置一些 1 * 1 * 1  的立方体。
 *
 * <p>每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。
 *
 * <p>请你返回最终形体的表面积。
 *
 * <p>
 *
 * <p>示例 1：输入：[[2]] 输出：10
 *
 * <p>示例 2：输入：[[1,2],[3,4]] 输出：34
 *
 * <p>示例 3：输入：[[1,0],[0,2]] 输出：16
 *
 * <p>示例 4：输入：[[1,1,1],[1,0,1],[1,1,1]] 输出：32
 *
 * <p>示例 5：输入：[[2,2,2],[2,1,2],[2,2,2]] 输出：46
 *
 * <p>提示：1 <= N <= 50，0 <= grid[i][j] <= 50
 *
 * <p>来源：力扣（LeetCode） 链接：https://leetcode-cn.com/problems/surface-area-of-3d-shapes
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class day25 {
    public static void main(String[] args) {
        System.out.println(new day25().surfaceArea(new int[][] {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}}));
    }

    public int surfaceArea(int[][] grid) {
        int n = grid.length;
        int cover = 0;
        int sum = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {

                sum += grid[i][j];
                // 上下
                if (grid[i][j] - 1 > 0) cover += (grid[i][j] - 1) * 2;

                // 左
                if (j > 0) cover += Math.min(grid[i][j], grid[i][j - 1]) * 2;

                // 前
                if (i > 0) cover += Math.min(grid[i][j], grid[i - 1][j]) * 2;
            }
        }
        return 6 * sum - cover;
    }
}
